STAAD.Pro Help

OS. PythonでのOpenSTAADプログラムの記述

この例では、PythonでOpenSTAADアプリケーションを記述するために必要ないくつかの概念を紹介します。

ヒント: 前の"Hello World!"の例に従った場合は、その行を削除するだけで、その時点から開始することができます。

OS. PythonでのOpenSTAADの開始

注記: この例では、STAAD.Proでモデルを開いておく必要があります。そうしないと、コードからエラーが返されます。
  1. 次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
    from comtypes import automation
    from comtypes import client
    import ctypes

    ここでは、comtypesライブラリを使用して、 COMオブジェクト(OpenSTAADなど)を使用できるようにしています。

  2. os = client.GetActiveObject("StaadPro.OpenSTAAD")」と入力し、<Enter>キーを押します。

    これにより、OpenSTAADが開始され、プログラムの現在のSTAAD.Proモデルに接続されます。

この時点で、プログラムは次のようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")

OS. Geometryメソッドの使用

  1. geometry = os.Geometry」と入力し、<Enter>キーを押します。

    これにより、ジオメトリ変数がOpenSTAADのGeometryグループのメソッドとして定義されます。

  2. geometry._FlagAsMethod("GetNodeCount")」と入力し、<Enter>キーを押します。 これは、PythonでOpenSTAADメソッドを正しく識別するために必要です。
    注記: これは、OpenSTAADメソッドを使用してPythonプログラムで初めてメソッドを使用するときに必要です。そのメソッドを同じコード内で使用するときに毎回必要なわけではありません。
  3. geometry._FlagAsMethod("GetMemberCount")」と入力し、<Enter>キーを押します。 これは、PythonでOpenSTAADメソッドを正しく識別するために必要です。
    注記: これは、OpenSTAADメソッドを使用してPythonプログラムで初めてメソッドを使用するときに必要です。そのメソッドを同じコード内で使用するときに毎回必要なわけではありません。
この時点で、プログラムは次のようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")

OS. 単一の値のみを返す関数の使用

  1. nodeCount = geometry.GetNodeCount」と入力し、<Enter>キーを押します。

    これにより、OpenSTAADメソッドGetNodeCount()を使用して、アクティブなSTAAD.Proモデル内のノードの数が指定した変数に返されるようになります。

  2. beamCount = geometry.GetMemberCount」と入力し、<Enter>キーを押します。

    同様に、OpenSTAADメソッドGetMemberCount()を使用して、アクティブなSTAAD.Proモデル内のメンバーの数が指定した変数に返されるようになります。

    ヒント: 使用可能なメソッドの詳細、およびそれぞれで入力として受け入れられる値と返される値については、OpenSTAADのドキュメントを参照してください。
この時点で、プログラムは次のようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount
beamCount = geometry.GetMemberCount

OS. 値のリストのみを返す関数の使用

ここでは、値のリストを配列に格納します。

  1. comptypesライブラリからインポートされたautomationクラスを使用して、異なるデータタイプで使用する複数のバリアント配列を定義します。
    1. def make_safe_array_double(size): return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)」と入力し、<Enter>キーを押します。

      これにより、倍精度浮動小数点の10進数値で構成される配列タイプが定義されます。

    2. def make_safe_array_int(size): return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)」と入力し、<Enter>キーを押します。

      これにより、整数で構成される配列タイプが定義されます。

    3. def make_safe_array_long(size): return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)」と入力し、<Enter>キーを押します。

      これにより、長整数値で構成される配列タイプが定義されます。

  2. 次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
    def make_variant_vt_ref(obj, var_type):
        var = automation.VARIANT()
        var._.c_void_p = ctypes.addressof(obj)
        var.vt = var_type | automation.VT_BYREF
        return var
    この定義により、GetBeamList()など、長い型の値のリストを返すメソッドを呼び出せるようになります。
  3. geometry._FlagAsMethod("GetBeamList")」と入力し、<Enter>キーを押します。
  4. 次に、この識別されたメソッドを使用して、モデル内のビームのリストを新しい配列に取り込みます。
    1. safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)」と入力し、<Enter>キーを押します。

      これにより、前のbeamCountの結果を使用して配列の必要なサイズが確立されます。

    2. beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)」と入力し、<Enter>キーを押します。

      これにより、値を格納するための適切なサイズを持つbeamsという名前の配列が作成されます。

    3. geometry.GetBeamList(beams)」と入力し、<Enter>キーを押します。

      これは、新しく作成された配列beamsに戻り値を格納するために使用されます。

  5. 次に、前の手順と同様の方法で、解析結果の取得と使用するメソッドの識別に使用されるOpenSTAADのメソッドのグループを追加します。
    1. output = os.Output」と入力し、<Enter>キーを押します。

      これにより、出力変数が解析結果の取得に使用されるOpenSTAADのOutputグループのメソッドとして定義されます。

    2. output._FlagAsMethod("GetSupportReactions")」と入力し、<Enter>キーを押します。
  6. 次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
    nodeNo = 1
    loadcaseNo = 1
    このチュートリアルでは、これらの値を"ハードコーディング"します。
    注記: ここでは、ノード番号1と荷重ケース番号1がアクティブなSTAAD.Proモデルに存在し、解析結果も利用できるものと仮定します。
  7. 次に、この識別されたメソッドを使用して、指定されたノードと荷重ケースのサポート反力を新しい配列に取り込みます。
    1. safe_array_reactions = make_safe_array_double(6)」と入力し、<Enter>キーを押します。 これにより、前に定義した倍精度の配列タイプを使用して固定サイズの配列が作成されます(固定サイズの6は任意のサポートにおいて取り得る反力の数です)。
    2. reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)」と入力し、<Enter>キーを押します。 これにより、値を格納するための適切なサイズを持つreactionsという名前の配列が作成されます。
    3. output.GetSupportReactions(nodeNo, loadcaseNo, reactions)」と入力し、<Enter>キーを押します。

      このメソッドでは、最初の2つのパラメーターを入力として使用し、新しく作成された配列reactionsに戻り値を格納します。

この時点で、プログラムは次のようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount()
beamCount = geometry.GetMemberCount()
def make_safe_array_double(size): 
    return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)
def make_safe_array_int(size): 
    return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)
def make_safe_array_long(size): 
    return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)
def make_variant_vt_ref(obj, var_type):
    var = automation.VARIANT()
    var._.c_void_p = ctypes.addressof(obj)
    var.vt = var_type | automation.VT_BYREF
    return var
geometry._FlagAsMethod("GetBeamList")
safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)
beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)
geometry.GetBeamList(beams)
output = os.Output
output._FlagAsMethod("GetSupportReactions")
nodeNo = 1
loadcaseNo = 1
safe_array_reactions = make_safe_array_double(6)
reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)
output.GetSupportReactions(nodeNo, loadcaseNo, reactions)

OS. OpenSTAAD出力の生成

  1. print( str(nodeCount) + ' joints')」と入力し、<Enter>キーを押します。

    この行では、最も内側の操作から外側に向かって、まずnodeCountに格納された数値の結果を文字列に変換しています。次に、出力が解釈しやすくなるように、その文字列をテキスト文字列「' joints'」と組み合わせています。その連結された文字列全体が端末に出力されます。

  2. print(str(beamCount) + ' members')」と入力します。

    同様に、ここでは、文字列に変換されたbeamCountの値をテキストと連結し、その結果を端末に表示しています。

  3. モデル内のビーム番号を出力するには、次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
    print("Beam Numbers")
    for beam in beams:
        print(beam)

    これは、"for"ループを使用して、beamsという名前の配列内に各ビーム番号を出力します。

  4. 荷重ケース1のノード1のサポート反力値を出力するには、次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
    print("Support Reactions")
    for reaction in reactions:
        print(reaction)
最終的なプログラムは次のようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount()
beamCount = geometry.GetMemberCount()
def make_safe_array_double(size): 
    return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)
def make_safe_array_int(size): 
    return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)
def make_safe_array_long(size): 
    return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)
def make_variant_vt_ref(obj, var_type):
    var = automation.VARIANT()
    var._.c_void_p = ctypes.addressof(obj)
    var.vt = var_type | automation.VT_BYREF
    return var
geometry._FlagAsMethod("GetBeamList")
safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)
beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)
geometry.GetBeamList(beams)
output = os.Output
output._FlagAsMethod("GetSupportReactions")
nodeNo = 1
loadcaseNo = 1
safe_array_reactions = make_safe_array_double(6)
reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)
output.GetSupportReactions(nodeNo, loadcaseNo, reactions)
print(str(nodeCount) + ' joints')
print(str(beamCount) + ' members')
print("Beam Numbers")
for beam in beams:
    print(beam)
print("Support Reactions")
for reaction in reactions:
    print(reaction)

OS. コードの実行

これまでの作業で、現在アクティブなSTAAD.Proモデルに関する情報を提供するPythonコードの準備ができました。次に、このコードを実行してテストします。

  1. 次のどちらかの方法で、これまでの作業を保存します。

    「ファイル」 > 「保存」の順に選択する

    または

    <Ctrl+S>キーを押す

  2. 「実行」ツールを選択してコードを実行します。 ターミナルが開き、結果が表示されます。
    ヒント: 実行するとわかりますが、この操作の実行にはPowershellの命令が使用されています。このコマンドは、Visual Studio Codeの外部の任意のPowershellウィンドウからプログラムを実行するために使用することができます。

コメントを使用してコードに注釈を付けることをお勧めします。これにより、コードによる処理内容(あるいは少なくともその意図)を他のユーザーが理解しやすくなります。この完全な例には、該当するコメントが含まれています。

Microsoft Visual Studio CodeでPythonの例を実行

OS. うまくいかない場合の対応

まだ行っていない場合は、リンターをインストールしてください。これにより、Pythonプログラムに関する有用なフィードバックと、コードを最適化するための役立つヒントが提供されます。

また、IDEにより、コードで検出された問題に関するフィードバックが提供されます。ワードプロセッサのスペルチェックや文法チェックと同じように、コードを実行する前にエラーの通知を受け取ることができます。

Pythonインタープリタ(Python v3.8.n)とpywin32拡張機能を含む完全な環境が設定されていること、およびSTAAD.Proでモデルが開いていることを確認します。STAAD.Proにアクティブなモデルがあることは、すべてのSTAAD.Proプログラムで必須というわけではありませんが、この特定のプログラムでは必要です。

Visual Studio Codeのデバッグツールを使用すると、コードの解釈を"ステップ"単位で進めて問題を特定することができます。メインコードウィンドウで行番号の左側をクリックすると、ブレークポイントが追加されます。次に、「実行」タブを選択します(または<Ctrl+Shift+D>キーを押します)。「実行とデバッグ」ボタンをクリックしてプロセスを開始します。ターミナルでのプログラムの実行に合わせて追加情報が提供され、各ブレークポイントで一時停止します。

このエディタでのデバッグ機能の使用に関する詳細については、Visual Studio Codeコードのヘルプを参照してください。